home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #5
/
Amiga Plus CD - 2000 - No. 5.iso
/
Tools
/
Dev
/
Real
/
wfmhcybergfx_key.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-01-01
|
8KB
|
352 lines
/* user data. should be modified externally */
#define ID_CHECKSUM 88
#define USER_NR 47
#define USER_NAME "Kenichi Uda"
#define USER_STREET "85 Imahara cho Nisigamo Kita Ku"
#define USER_CITY "Kyoto 603-8842"
#define USER_COUNTRY "Japan"
#define USER_STREAM "X-!axl5aw3xbq21wr4aqegaz!-=hpA=?=Xq@x5Q6a!p_xAX"
#define REVISION "40.2"
#define AUTHOR "Miloslaw Smyk"
#define VERNUM 40
#define REVNUM 2
#define PROGNAME "wfmhcybergfx_key.library"
/* some useful includes */
#include <string.h>
#include <exec/types.h>
#include <exec/execbase.h>
#include <exec/memory.h>
#include <exec/nodes.h>
#include <clib/exec_protos.h>
#include <pragmas/exec_sysbase_pragmas.h>
#include <clib/alib_protos.h>
#include <clib/macros.h>
#include "wfmhcybergfx_key.h"
#include "key.h"
/* standard version string */
int dither_type = DT_NONE;
static const char version[] = "\0$VER: " PROGNAME " " REVISION " " __AMIGADATE__ " © 1995-97 " AUTHOR " / World Federation of Mad Hackers";
static const char number[] = USER_STREAM;
struct Library *SysBase;
struct KeyBase *KeyBase;
struct UserInfo authorized_user =
{
USER_NR,
USER_NAME,
USER_STREET,
USER_CITY,
USER_COUNTRY
};
/*
** 4x4 4-bit dispersed dot ordered dither pattern, which is the base
** for final dither pattern, calculated as soon as screen depth
** is known.
*/
const UBYTE dithBase[4][4] = {
1, 15, 2, 12,
9, 5, 10, 7,
3, 13, 0, 14,
11, 7, 8, 4
};
static struct dith
{
UBYTE r, g, b, g2;
} dith[4][4];
struct dither_val
{
UBYTE r[2], g[2], b[2], g2[2];
} dither[256];
int red5[256], green5[256], blue5[256], green6[256];
enum {COL_ORIGINAL, COL_SHIFTED};
/* macros we use to get fractions with integer math */
#define SCALING_FACTOR 4
#define HALF 8
#define DESCALE(expr) (((expr) + HALF) >> SCALING_FACTOR)
void __asm __saveds LIBInitDithering(void)
{
int i,j;
/* calculate errors for every possible pixel value. */
for(i = 0; i < 256; i++)
{
red5[i] = i - ((i + 4) & ~0x07);
green5[i] = i - ((i + 4) & ~0x07);
green6[i] = i - ((i + 2) & ~0x03);
blue5[i] = i - ((i + 4) & ~0x07);
}
for(i = 0; i < 256; i++)
{
dither[i].r[COL_ORIGINAL] = i & ~0x07;
dither[i].g[COL_ORIGINAL] = i & ~0x07;
dither[i].g2[COL_ORIGINAL] = i & ~0x03;
dither[i].b[COL_ORIGINAL] = i & ~0x07;
dither[i].r[COL_SHIFTED] = MIN(i + 8, 255);
dither[i].g[COL_SHIFTED] = MIN (i + 8, 255);
dither[i].g2[COL_SHIFTED] = MIN(i + 4,255);
dither[i].b[COL_SHIFTED] = MIN(i + 8, 255);
}
for(j = 0; j < 4; j++)
for(i = 0; i < 4; i++)
{
dith[i][j].r = (dithBase[i][j] * 16) / 32;
dith[i][j].g = (dithBase[i][j] * 16) / 32;
dith[i][j].g2 = (dithBase[i][j] * 16) / 64;
dith[i][j].b = (dithBase[i][j] * 16) / 32;
}
}
void __asm __saveds LIBSetDitherType(register __d0 UBYTE type)
{
dither_type = type;
}
void __asm LIBCalcChecksum(register __d0 int *sum, register __a0 char *txt)
{
while(*txt)
*sum ^= *txt++;
}
void __asm __saveds LIBDitherLine(register __a0 struct R3DHandle *handle, register __a1 UBYTE *buf, register __d0 int len, register __d1 int x, register __d2 int y)
{
int i;
int bsame_r, bnext_r, next_r;
int bsame_g, bnext_g, next_g;
int bsame_b, bnext_b, next_b;
UBYTE *inptr;
SHORT *errptr;
int delta;
int temp;
volatile int check = USER_NR + 151429;
if(handle->depth == 15 || handle->depth == 16)
{
switch(dither_type)
{
case DT_FS:
if(handle->line_width != len)
{
if(handle->line)
FreeVec(handle->line);
handle->line = AllocVec(sizeof(SHORT) * (len + 2) * 3, MEMF_ANY | MEMF_CLEAR);
handle->line_width = len;
}
inptr = buf;
errptr = handle->line + 3;
/* make sure there is no error at the start of the line */
for(i = 0; i < 3; i++)
errptr[i] = 0;
bsame_r = bnext_r = next_r = 0;
bsame_g = bnext_g = next_g = 0;
bsame_b = bnext_b = next_b = 0;
for(i = 0; i < len; i++)
{
/* red component */
temp = *inptr + DESCALE(next_r + bsame_r);
if(temp < 0)
*inptr = 0;
else
if(temp > 255)
*inptr = 255;
else
*inptr = temp;
/* right-down pixel gets 1/16 of error */
bnext_r = red5[*inptr];
delta = bnext_r << 1;
/* left-down pixel gets 3/16 of error */
next_r = bnext_r + delta;
*(errptr - 3) += next_r;
/* pixel below gets 5/16 of error */
next_r += delta;
*errptr += next_r;
/* next pixel (to the right) gets 7/16 of error */
next_r += delta;
/* try to get closest match with color-gun */
if(*inptr < 252)
*inptr += 4;
bsame_r = *(errptr);
*(errptr) = bnext_r;
errptr++;
inptr++;
/* green component */
temp = *inptr + DESCALE(next_g + bsame_g);
if(temp < 0)
*inptr = 0;
else
if(temp > 255)
*inptr = 255;
else
*inptr = temp;
/* right-down pixel gets 1/16 of error */
bnext_g = handle->depth == 15 ? green5[*inptr] : green6[*inptr];
delta = bnext_g << 1;
/* left-down pixel gets 3/16 of error */
next_g = bnext_g + delta;
*(errptr - 3) += next_g;
/* pixel below gets 5/16 of error */
next_g += delta;
*errptr += next_g;
/* next pixel (to the right) gets 7/16 of error */
next_g += delta;
/* try to get closest match with color-gun */
if(handle->depth == 15)
{
if(*inptr < 252)
*inptr += 4;
}
else
{
if(*inptr < 254)
*inptr += 2;
}
bsame_g = *(errptr);
*(errptr) = bnext_g;
errptr++;
inptr++;
/* blue component */
temp = *inptr + DESCALE(next_b + bsame_b);
if(temp < 0)
*inptr = 0;
else
if(temp > 255)
*inptr = 255;
else
*inptr = temp;
/* right-down pixel gets 1/16 of error */
bnext_b = blue5[*inptr];
delta = bnext_b << 1;
/* left-down pixel gets 3/16 of error */
next_b = bnext_b + delta;
*(errptr - 3) += next_b;
/* pixel below gets 5/16 of error */
next_b += delta;
*errptr += next_b;
/* next pixel (to the right) gets 7/16 of error */
next_b += delta;
/* try to get closest match with color-gun */
if(*inptr < 252)
*inptr += 4;
bsame_b = *(errptr);
*(errptr) = bnext_b;
errptr++;
/* advance input pointer */
inptr += 2;
}
break;
case DT_ORDERED:
FindTask(NULL);
if(handle->depth == 15)
for(i = 0; i < len * 4; i += 4)
{
if(buf[i] - dither[buf[i]].r[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].r)
buf[i] = dither[buf[i]].r[COL_SHIFTED];
if(buf[i + 1] - dither[buf[i + 1]].g[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].g)
buf[i + 1] = dither[buf[i + 1]].g[COL_SHIFTED];
if(buf[i + 2] - dither[buf[i + 2]].b[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].b)
buf[i + 2] = dither[buf[i + 2]].b[COL_SHIFTED];
}
else
for(i = 0; i < len * 4; i += 4)
{
if(buf[i] - dither[buf[i]].r[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].r)
buf[i] = dither[buf[i]].r[COL_SHIFTED];
if(buf[i + 1] - dither[buf[i + 1]].g2[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].g2)
buf[i + 1] = dither[buf[i + 1]].g2[COL_SHIFTED];
if(buf[i + 2] - dither[buf[i + 2]].b[COL_ORIGINAL] > dith[y & 3][(i / 4) & 3].b)
buf[i + 2] = dither[buf[i + 2]].b[COL_SHIFTED];
}
break;
}
}
check++;
}
struct UserInfo * __asm __saveds LIBGetUserInfo(void)
{
int sum = 0;
CalcChecksum(&sum, authorized_user.name);
CalcChecksum(&sum, authorized_user.street);
CalcChecksum(&sum, authorized_user.city);
CalcChecksum(&sum, authorized_user.country);
sum += authorized_user.number;
// printf("sum: %d\n", ((sum >> 1) - 4) << 1);
authorized_user.sum = sum;
SysBase = (*(struct Library **)((sum >> 1) - (ID_CHECKSUM >> 1)));
return(&authorized_user);
}
int __asm __saveds __UserLibInit(register __a6 struct KeyBase *libbase)
{
KeyBase = libbase;
// SysBase = (*(struct Library **)4);
return(0);
}
void __saveds __UserLibCleanup(void)
{
}